package com.tangruojie.domain.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.tangruojie.enums.UserSex;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Data
@NoArgsConstructor
@AllArgsConstructor
/**
 * 开启自动结果映射：autoResultMap = true
 */
@TableName(value = "tbl_user", autoResultMap = true)
public class User {

    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    private String name;
    /**
     * 自动映射枚举
     */
    private UserSex sex;
    @TableField(select = false)
    private String password;
    private Integer age;
    private String telephone;
    /**
     * 逻辑删除
     */
    @TableLogic
    private Integer deleted;
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * 乐观锁
     */
    @Version
    private Integer version;
    /**
     * MyBatis-Plus 使用反射机制读取实体类的字段名和类型，但也结合了 JavaBean 命名规范来推断数据库字段名。
     * 底层逻辑如下：
     * 使用反射拿到实体字段名；
     * 如果字段是 Boolean 且以 is 开头，例如 isOnline；
     * 则自动将 is 去掉，剩下的部分转成小写首字母驼峰或下划线；
     * 最终得到字段名 online；
     * 如果字段不是以 is 开头，则原样处理。
     */
    private Boolean online;
    /**
     * 非数据库字段
     */
//    @TableField(exist = false)
    /**
     * 多表查询
     */
    private Integer address;
    /**
     * JSON字段处理器
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private UserTeacher userTeacher;

}
/**
 * @TableField(exist = false) 和 @TableField(select = false) 的字段，在 SQL 查询中不会被返回，因此在实体类返回时也 仍然存在字段，但值为 null，除非你手动补全这些值。
 * 特性	                            exist = false	                select = false
 * 是否映射数据库字段	                ❌ 否	                        ✅ 是
 * 查询是否默认返回	                ❌ 否	                        ❌ 否
 * 是否可通过 wrapper.select 查询	    ❌ 不能，因为字段不存在于数据库	    ✅ 可以手动添加字段名
 * 作用	                            声明一个与数据库无关的业务字段	    隐藏敏感字段，不在默认查询中出现
 */